package com.example.wangzh.developkit.base;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;


import butterknife.ButterKnife;

/**
 * Created by zhwang16 on 2018/1/3.
 */

public abstract class BasePopupWindow extends PopupWindow {
    private RelativeLayout contentView;
    protected Activity activity;

    protected abstract int getLayoutRes();

    public BasePopupWindow(Activity activity) {
        super(activity);
        this.activity = activity;
        //contentView作为灰色背景，childView作为弹窗，
        // 1.这样可以使点击外部背景的dissmiss事件和点击内部按钮的dismiss事件区分开来
        // 2.更容易控制弹窗在父布局中的位置
        contentView = new RelativeLayout(activity);
        contentView.setBackgroundColor(Color.parseColor("#99000000"));
        contentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //借用isOutsideTouchable属性，来判断点击背景时是不是可取消
                if (isOutsideTouchable()) {
                    dismiss();
                }
            }
        });
//        当我们想在一个layout组件中用java代码动态添加一个button时，
//        我们可能直接用addView（view v）方法来添加组件。比如，我们想在一个linearlayout中添加一个button
//        ，而该button布局直接用xml来定义：

//        button.xml:
//        <Button
//        android:layout_width:100dp
//        android:layout_height:100dp/>

//        这就是整个xml的内容，button的宽高都是100dp。当我们用
//        layoutinflater.inflate(R.layout.button,null)
//        将该布局实例化并添加到视图中后，显示的结果却不正确：
//        button的宽高都不是100dp，而是仅仅是内容大小（wrap_content）。
//        这是因为我们在inflate方法中，第二个参数为null导致的。
//        实际上，layout_width是相对于布局的高，只有在这个组件处于一个布局中时，该宽高才有效。
//        而当inflate方法第二个参数为空时，layout_width和layout_height都失去了意义。
//        因此，我们需要将原先的button定义在一个layout之中，该layout的layout_height和layout_width随便设置，
//        因为同刚才所说的，该layout由于没有指定根组件，所以其宽高无效，但是其内部组件的宽高有效了。？？？
        RelativeLayout tempLayout = new RelativeLayout(activity);
        View childView = LayoutInflater.from(activity).inflate(getLayoutRes(), tempLayout);
        contentView.addView(childView, getChildLp());
        childView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
        setContentView(contentView);
        ButterKnife.bind(this, contentView);
        initView();
        setWidth(LayoutParams.MATCH_PARENT);
        setHeight(LayoutParams.MATCH_PARENT);
//        this.setFocusable(true);//这里一定不能调用setFocusable方法，否则虚拟键盘会弹出
        this.setOutsideTouchable(true);
        // 刷新状态
        this.update();
        // 实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ，设置其他控件变化等操作
        this.setBackgroundDrawable(dw);
    }

    /**
     * 重写此方法可以更改实际布局在屏幕中的显示位置（contentView是一个match_parent的RelativeLayout，
     * 其大小与屏幕相同，修改childView在contentView中的位置即相当于更改实际布局在屏幕中的显示位置
     *
     * @return
     */
    protected RelativeLayout.LayoutParams getChildLp() {
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        return lp;
    }

    protected void initView() {
    }

    public void show() {
        if (!isShowing()) {
            this.showAtLocation(activity.getWindow().getDecorView(), Gravity.CENTER, 0, 0);
        }
    }
}
